home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekikoh Dennoh Club 1
/
Gekikoh Dennoh Club Vol. 1 (Japan).7z
/
Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin
/
tools
/
cdc
/
src
/
cdrt.s
< prev
next >
Wrap
Text File
|
1997-03-29
|
30KB
|
1,286 lines
tr5s:
cmpi.w #$40,d0
bcs @f
moveq #-1,d0 *コール無し
rte
@@: movem.l d1-d7/a0-a6,-(sp)
add.w d0,d0
add.w d0,d0
lea tr5tabs(pc),a6
movea.l (a6,d0.w),a6
jsr (a6)
movem.l (sp)+,d1-d7/a0-a6
rte
*---------------------------------------------------
*
* SYSTEM 関係
*
tr5_00: *--------------------------------------------
*_CDC_VERSION equ $00
*
* ・ドライバーのバージョンチェック
*
* [引 数] なし
* [戻り値] d0.l = $0110
*
move.l #$0110,d0
rts
tr5_01: *--------------------------------------------
*_CDC_INIT equ $01
*
* ・CD 及び ドライバーの初期化をする ([CLR]キー同等)
*
* [引 数] なし
* [戻り値] なし
*
* 演奏中止し、モードもクリアします。ただし、プログラムは残
* ります。
*
* [参 考] CD-ROM に対し REZEROUNIT を送りますので多少時間の
* かかる場合があります。割り込み中など処理を早くした
* い場合、_CDC_STOP を使用するといいでしょう。
*
jbsr _ZeroUnit
jbsr _CdcModeOn
clr.w _AutoMode *0:ノーマル 1:オート
clr.w _RndMode *0:ノーマル 1:ランダム
clr.w _LEDVMOD
bsr _FlgClrS
bra tr5_exsub
*---------------------------------------------------
*
* ワークアドレスゲット 関係
*
tr5_02: *--------------------------------------------
*_CDC_STAT equ $02
*
* ・CDの現在の状態の書かれたアドレスを返す
*
* [引 数] なし
* [戻り値] d0.l = ワークアドレス
*
* offset
* ( 0) .dc.w 0;NoCD 1;SetCD
* ( 2) .dc.l 状態 0x11;演奏中,0x12;一時停止,0x13;停止
* ( 6) .dc.l 曲番号
* (10) .dc.l 演奏中の曲の経過時間 (MSF型)
* (14) .dc.l CD絶対総 経過時間 (MSF型)
* (18) .dc.l 現在演奏曲のながさ (MSF型)
* (22) .dc.l CD名アドレス
* (26) .dc.l 曲名アドレス
* (30) .dc.l LED文字アドレス -----以下LED部に表示される物
* (34) .dc.l LED数値 曲番号
* (38) .dc.l LED数値 1以上;プログラムナンバー
* 0;表示無し -1;MAX= -2;INP= -3;Vol
* (42) .dc.l LED数値 タイム (MSF型)
* (46) .dc.l LEDの状態
* ┌bit 0 ■:停止
* │bit 1 >:再生
* │bit 2 ||:一時停止
* イズレカ│bit 3 >>:早送り
* └bit 4 <<:巻き戻し
* ┌bit 5 ⊂:オート
* └bit 6 ◯:リピート
* bit 7 R:ランダム
* bit 8 P:メモリー
* (bit 9 B:BGM)
* (50) .dc.b 入力されている数値(上)
* (51) .dc.b 入力されている数値(下)
* (52) .dc.w LED数値 タイム のモード
* 0;ノーマル
* 1;リバース
* 2;トータル
* 3;トータルリバース
* (54) .dc.w Vol数値
* (56) .dc.w MasterVol数値(0ならボリューム機能無し)
*
* 表示 LED 文字アドレスは基本的に同じアドレスを返し
* ます。内容が変わったかどうかは曲名アドレスを監視す
* ることで可能です。
*
* CDの現在の状態の書かれたアドレスを返します。アドレスは
* 固定されてますが、内容はトラップ時にのみ更新されるものもあ
* ります。
*
* 基本的に読みだし専用です。
*
* [参 考] CDC.x の機能が停止ているばあい同じ値を返します。
* ( LED 文字アドレスも0の時もあります。)
* _CDC_POWER($35)でチェックしてください。
*
lea _plyinf-2(pc),a0
lea _CHARBUF(pc),a1 *決まりadd
move.l a1,30(a0) */
lea _CdName(pc),a1
move.w _CDIN(pc),d0 *tst
bne @f
lea NullStr(pc),a1
@@: move.l a1,22(a0)
move.w _CDIN(pc),(a0)
moveq #$13,d1
moveq #0,d0
move.w _TrkNo(pc),d0
move.l d0,6(a0)
beq @f
moveq #$11,d1
move.w _PauseMode(pc),d0 *tst
beq @f
moveq #$12,d1
@@: move.l d1,2(a0)
move.l a0,d0
rts
NullStr:
.dc.b 0,0
.even
tr5_03: *--------------------------------------------
*_CDC_TRACKS equ $03
*
* ・CD-DA のCDの総合時間、曲数、曲の演奏時間、曲名の書かれ
* たアドレスを返す
*
* [引 数] なし
* [戻り値] d0.l = 曲名リストワークアドレス
*
* offset
* ( 0) .dc.w 0;NoCD 1;SetCD
* ( 2) .dc.l CDC.xの最大記憶数(以下,記憶数)
* ( 6) .dc.l CDの曲数
* (10) .dc.l CDの全演奏時間
* (14) .dc.l CDCLISTにあったか -1ならあった
* (18) .dcb.b 40,0 CD名 40-1文字
* (58) .dsb.b (記憶数)*40 各曲の名前 40-1文字
* .dsb.l (記憶数) 各曲の演奏時間+拡張曲名flag
* .dsb.l (記憶数) 各曲のスタート時間
* (↑最上位ビットが立っ
* ていれば データトラック)
*
* CD名、曲名以外の書き替えは禁止です。名前は変更可能です。
*
lea _CdcTrak-2(pc),a0
move.w _CDIN(pc),(a0)
move.l a0,d0
rts
*---------------------------------------------------
*
* 外部コントロール用 関係
*
tr5_04: *--------------------------------------------
*_CDC_SCSI_CHK equ $04
*
* ・SCSI の状態を返す
*
* [引 数] なし
* [戻り値] d0.l = 0 ; 使用可能
* < 0 ; 使用不可
*
* TRAP #5 で SCSI を使用するものの場合このコールでチェック
* してから使用してください。
*
tst.b ScIocsSwc
bne @f
*bsr _scsi_cmd_chk
bsr ScsiUseChk
bne @f
moveq #0,d0 * beq :使える
rts
@@:
moveq #-1,d0 * bne :つかえない
rts
tr5_05: *--------------------------------------------
*_CDC_RELED equ $05
*
* ・LED 部の書き直し、CD-ROM の状態を再チェック
*
* [引 数] なし
* [戻り値] なし
*
* LED の書き直しを行います。TRAP #5 で CDC.x を操作した場
* 合すぐにLED部(_CDC_STAT のワークも含む)に表れないものがあ
* ります。TIMER-C が生きている場合一秒(/Tによる)以内には書き
* 直されますが、このコールを使えばすぐに書き直されます。
* TRAP#5を使わず外部で演奏開始等した場合もこのコールを呼べ
* ば認識します。
* また、入力された数値のキャンセルも行います。
*
* [参 考] CDCコール番号の $1? はすぐに書き直されるようになっ
* てます。
*
jbsr _ChkCdRom
tst.w _MastVol
beq @f
jbsr _NowVol
move.w d0,_Volum
@@:
tst.w _CDIN
jbeq 1f
move.l _plyinf,d0 *plyinf.fg
cmpi.b #$11,d0
jbne @f
move.l _plyinf+4,d0 *plyinf.track_no;
move.w d0,_TrkNo
move.w d0,_TrkNoS
jbsr _SetTrkLong
@@: jbsr _MemChkT
1:
bra _B_KLE_D
tr5_06: *--------------------------------------------
moveq #-1,d0 *コール無し
rts
*---------------------------------------------------
*
* キーコントロール 関係
*
tr5_07: *--------------------------------------------
*_CDC_INKEY equ $07
*
* ・CDCのキー割り込みルーチンを呼ぶ
*
* [引 数] d1.b = キーボードコード
* [戻り値] なし
*
* キーボードのコードを送ることで CDC をコントロールする
*
*┌─┐┌─┐ ┌─┬─┬─┐┌─┬─┬─┬─┐
*│ ││ │ ─┬──┐│ │ │ ││ │記│登│ │
*└─┘└─┘ ─┴──┘└━┴━┴━┘└━┴─┴─┴─┘
*┌─┬─┬ ─┬──┐┌─┬─┬─┐┌─┬─┬─┬─┐
*│ES│ │ │ BS ││HM│ │DL││CL│/│*│-│
*├─┴┬┴ ┬┴┬┴┬ ┬┴┬┴──┤├─┼━┼─┤├─┼─┼─┼─┤
*│ TAB│ │E│R│ │[゚│ ││RU│RD│UN││7│8│9│+│
*├──┼ ┴┬┴┬┴ ┴┬┴┐ CR │├─┼─┼─┤├─┼─┼─┼─┤
*│ │]ム│ ││ │↑│ ││4│5│6│=│
* ┴┬┴──┤│←├─┤→│├─┼─┼─┼─┤
* │ ││ │↓│ ││1│2│3│ │
* ┴┬──┘├─┴┬┴─┤├─┼─┼─┤EN│
* │ │ │ ││0│,│.│ │
* ━┘ └──┴──┘└─┴─┴─┴─┘
*
*┌─┐┌─┐ ┌─┬─┬─┐┌─┬─┬─┬─┐
*│ ││ │ ─┬──┐│ │ │ ││ │52│53│ │
*└─┘└─┘ ─┴──┘└━┴━┴━┘└━┴─┴─┴─┘
*┌─┬─┬ ─┬──┐┌─┬─┬─┐┌─┬─┬─┬─┐
*│01│ │ │ 0F ││36│ │37││3F│40│41│42│
*├─┴┬┴ ┬┴┬┴┬ ┬┴┬┴──┤├─┼━┼─┤├─┼─┼─┼─┤
*│ 10 │ │13│14│ │1C│ ││38│39│3A││43│44│45│46│
*├──┼ ┴┬┴┬┴ ┴┬┴┐ 1D │├─┼─┼─┤├─┼─┼─┼─┤
*│ │29│ ││ │3C│ ││47│48│49│4A│
* ┴┬┴──┤│3B├─┤3D│├─┼─┼─┼─┤
* │ ││ │3E│ ││4B│4C│4D│ │
* ┴┬──┘├─┴┬┴─┤├─┼─┼─┤4E│
* │ │ │ ││4F│50│51│ │
* ━┘ └──┴──┘└─┴─┴─┴─┘
*
* $3F [CLR] = CDC.x初期化
* $4E [ENT] = 演奏
* $4A [=] = PAUSE/RESUME
* $3B/$3D [←][→] = 巻戻し/早送り
* $38 [R-UP] = 1曲戻し *
* $39 [R-DN] = 1曲送り
* $3A [UNDO] = リピートモード
*
* などキー操作と同じ。他に
*
* $52 [記号入力]= 数値入力キャンセル。LEDの初期化にもなる
* (CDC_RELEDと同じ機能です。)
*
* があります(キー操作では出来ないようになってます)。
*
* 演奏開始の場合等、他のコールと違うのは入力されている数値
* に影響される点です。もしこのコールだけで指定の曲演奏したい
* 場合、まず、数値キーコードを送ってから演奏すれば可能です。
*
* [←][→](サーチキー)を使う場合は、連続で送ったあと、最後
* に 0 を送ってください。この時サーチ先から演奏されます。
*
* $38は連続でコマンドを送ったりすることで動作が違うので単
* 純に、曲の頭から、1曲戻すと言う場合 _CDC_MVPLAY($13)を使
* 用してください。
*
* [★注意]ver 1.06以前では
* $42/$46 [-][+] = 巻戻し/早送り
* でした。。
*
move.l d1,d0 *d0=キーボードコード
beq @f
move.w #1,KeySnsEM
bsr KeySns
clr.w KeySnsEM
rts
@@: move.l _SeekNow(pc),d0 *tst
bmi @f
move.w #1,KeySnsEM
bsr NokeySeek2
clr.w KeySnsEM
@@: rts
*---------------------------------------------------
*
* プログラム関係
*
tr5_08: *--------------------------------------------
*_CDC_PROG equ $08
*
* ・CDCのプログラムワークアドレスを返す
*
* [引 数] なし
* [戻り値] d0.l = メモリワークアドレス
*
* ( 0) .dc.w プログラム数
* ( 2) .ds.b 256,曲ナンバー列
*
* プログラムの直接書き替えも可能。ただし、書き替えたあとも
* う一度 _CDC_PROG をコールすること。プログラムを全部消去し
* たい場合、プログラム数を0に書き替えることで可能。
*
* [★注意]ver 1.08以前では
* ( 2) .ds.b 100,曲ナンバー列
* でした。。
*
moveq #0,d0
bsr _MemChkT
lea _MemLong(pc),a0
move.l a0,d0
rts
tr5_09: *--------------------------------------------
*_CDC_PROGIN equ $09
*
* ・指定曲ナンバーをプログラムに記憶する
*
* [引 数] d1.l = 曲ナンバー
* = -1 ; 現在プログラムされている数のみ返す
* d2.l = プログラムナンバー (0~)
* = -1 ;プログラムの最後に追加します ([.])
* [戻り値] d0.l = 現在プログラムされている数 ; 正常終了
* < 0 ; エラー(プログラム最大数を越える)
*
tst.l d1
bmi tr5_09E *d1=-1
tst.l d2
bmi tr5_09M
cmpi.l #PrgMax,d2
bcs @f
moveq #-1,d0 *d2がおかしい
rts
@@:
lea _MemSock(pc),a1
move.b d1,0(a1,d2.w)
bra tr5_09E
tr5_09M:
*d2=-1
move.w _MemLong(pc),d0
cmpi.w #PrgMax-1,d0
bcs @f
moveq #-1,d0 *これ以上はいらない
rts
@@:
lea _MemSock(pc),a1
move.b d1,0(a1,d0.w)
addq.w #1,_MemLong
tr5_09E:
bsr _MemChkT
moveq #0,d0
move.w _MemLong(pc),d0
rts
tr5_0a: *--------------------------------------------
*_CDC_PROGOUT equ $0A
*
* ・最後のプログラムの曲をプログラムから消す
*
* [引 数] なし
* [戻り値] d0.l = 現在プログラムされている数 ; 正常終了
* < 0 ; エラー
*
move.w _MemLong(pc),d0 *tst
bne @f
moveq #-1,d0
rts
@@: subq.w #1,_MemLong *メモリながさ 0以外ならMEMORY
bsr _MemChkT
moveq #0,d0
rts
tr5_0b: *--------------------------------------------
tr5_0c: *--------------------------------------------
tr5_0d: *--------------------------------------------
tr5_0e: *--------------------------------------------
moveq #-1,d0 *コール無し
rts
tr5_0f: *--------------------------------------------
*_CDC_PROGTIME equ $0F
*
* ・プログラムされた曲の総演奏時間を計算する
*
* [引 数] なし
* [戻り値] d0.l = ワークアドレス
*
* ( 0) .dc.l 演奏予定総長さ
* ( 4) .dc.l 演奏された曲の合計長さ
*
* プログラムされて曲の合計と演奏された曲の合計長さを返しま
* す。ただし、演奏されていない時は0,0がかえります。演奏中
* にプログラムの変更があると数値がおかしくなることがあります
* (変更されない)。
*
* [参 考]ランダム演奏時にも、ノーマル時にも有効。
* 意味がないので、そのうち消えるかも知れないコール
* 使用禁止 ^^;
*
move.l #tr5_0fwrk,-(sp)
jbsr _ProgTimeCalc
addq.l #4,sp
move.l #tr5_0fwrk,d0
rts
tr5_0fwrk:
.dc.l 0
.dc.l 0
*---------------------------------------------------
*
* 演奏関係
*
tr5_10: *--------------------------------------------
*_CDC_PLAY equ $10
*
* ・曲ナンバー指定によりノーマル演奏開始
*
* [引 数] d1.l = 開始曲ナンバー (0ならCDC管理演奏)
* d2.l = 終了曲ナンバー (-1なら最後まで)
* [戻り値] d0.l = 0 ; 正常終了
* < 0 ; エラー
*
clr.w _PauseMode *0:特に 1:ポーズ中
clr.w _ReptMode *0:ノーマル 1:リピート
clr.w _BgmMode *0:ノーマル 1:BGM
tst.l d1
bne @f
bsr _ChkCdRom
bsr Tent_sub
bra tr5_exsub
@@: move.l d2,-(sp)
move.l d1,-(sp)
bsr _ChkCdRom
bsr _CdPlay_hf
addq #8,sp
tst.l d0
bpl @f
rts
@@:
moveq #0,d0
bra tr5_exsub
tr5_11: *--------------------------------------------
*_CDC_PAUSE equ $11
*
* ・CD演奏の一時停止。演奏していない場合何もしない
*
* [引 数] なし
* [戻り値] なし
*
bsr _ChkCdRom
bsr _StpDsk
move.w #-1,_PauseMode *0:特に 1:ポーズ中
bra tr5_exsub
tr5_12: *--------------------------------------------
*_CDC_RESUME equ $12
*
* ・CD演奏の一時停止の解除。演奏中は何もしない
*
* [引 数] なし
* [戻り値] なし
*
bsr _ChkCdRom
bsr _Resume
clr.w _PauseMode *0:特に 1:ポーズ中
bra tr5_exsub
tr5_13: *--------------------------------------------
*_CDC_MVPLAY equ $13
*
* ・CD演奏の曲を変える
*
* [引 数] d1.l = 現在演奏中の曲からの ±値 (-1~1)
* [戻り値] d0.l = 0 ; 正常終了
* < 0 ; エラー
*
* 0を指定することで演奏中の曲を最初から。プログラムされて
* いる場合、プログラム順に曲を移動、演奏します。ランダムモー
* ド時は、どの曲にいくか判りません。
*
clr.w _PauseMode *0:特に 1:ポーズ中
move.l d1,-(sp)
bsr _ChkCdRom
move.w #1,_PlayScMd
bsr _CdPlay_restart
addq #4,sp
bra tr5_exsub
tr5_14: *--------------------------------------------
*_CDC_BGM equ $14
*
* ・指定アドレス間を繰り返し演奏する(BGMモード演奏)
*
* [引 数] d1.l = 開始トラックor開始アドレス
* d2.l = 終了アドレス (0ならその曲の最後の数値)
* d3.l = ループアドレス (0ならd1と同じ値に)
* (-1なら一度演奏で終わり)
* d4.l = ループ終了アドレス(0ならd2と同じ値に)
* [戻り値] d0.l = 0 ; 正常終了
* < 0 ; エラー
*
* d1.l は $100 未満であればトラック指定になります。
* d1.l が $100 以上であればアドレス指定になります。
*
* _CDC_MODE の戻り値が bit4;BGMが立ちます
*
* [参 考] 基本的に BGMとして CD を使う場合のコールなので
* LED部にBGMモードとは表示されません。
* 使う場合、キーボードからのコントロールを殺したほう
* がいいでしょう。
* ZCDC.x で使用してます。
*
clr.w _PauseMode *0:特に 1:ポーズ中
tst.l d3
bne @f
move.l d1,d3
andi.l #$00FFFFFF,d3
@@:
tst.l d4
bne @f
move.l d2,d4
andi.l #$00FFFFFF,d4
@@:
move.l d4,_BgmEdAdds
move.l d3,_BgmStAdds
move.l d2,-(sp)
move.l d1,-(sp)
bsr _ChkCdRom
bsr _FlgClrS
clr.w _AutoMode *0:ノーマル 1:オート
clr.w _RndMode *0:ノーマル 1:ランダム
bsr _CdPlay_hf
addq #8,sp
tst.l d0
bpl @f
rts
@@:
move.w #-1,_BgmMode *0:ノーマル 1:BGM
*bsr _MemChkT
moveq #0,d0
bra tr5_exsub
tr5_15: *--------------------------------------------
*_CDC_STOP equ $15
*
* ・CD演奏を停止する
*
* [引 数] なし
* [戻り値] なし
*
* _CDC_INIT に比べ高速です。割り込み中など処理が止まるのを
* 避けたい場合のみ使用してください。CDC.x 内部では「停止」に
* なりますが、CD-ROM自体の状態は一時停止になっています。また、
* LED の書き替えもすぐに行われません。
*
bsr _ChkCdRom
bsr _StpDsk
clr.w _AutoMode *0:ノーマル 1:オート
clr.w _RndMode *0:ノーマル 1:ランダム
bsr _FlgClrS
bra tr5_exsub
tr5_16: *--------------------------------------------
tr5_17: *--------------------------------------------
tr5_18: *--------------------------------------------
tr5_19: *--------------------------------------------
tr5_1a: *--------------------------------------------
tr5_1b: *--------------------------------------------
tr5_1c: *--------------------------------------------
moveq #-1,d0 *コール無し
rts
tr5_1d: *--------------------------------------------
*_CDC_PLAYWAIT equ $1D
*
* ・演奏開始後、ステイタス待ちをする( /PM 使用時対策用)
*
* [引 数] なし
* [戻り値] なし
*
* /PM 使用時、演奏開始を待たずに次の作業に移ります。が、タ
* イミングを取るためにはこれではまずい場合があります(ゲーム
* のBGMなど)。その時、これを実行します。演奏開始するまで待ち
* ます。
* /PM 使用していない場合や、演奏開始状態でない場合は無視さ
* れます。
*
bra _scsi_cmd_chk
tr5_1e: *--------------------------------------------
*_CDC_VOL equ $1E
*
* ・ボリュームを変更する
*
* [引 数] d1.l = 0~255 ; ボリュームを指定
* = -1 ; 現在のボリューム値を返す
* [戻り値] d0.l = 現在のボリューム値
* = -1 ; ボリューム非対応,エラー
*
*
* [参 考] マスターボリュームは _CDC_STAT で確認出来ます。
*
tst.w _MastVol
beq 2f
tst.l d1
bmi 1f
*======ボリューム指定
cmpi.l #255+1,d1
bcc 2f
moveq #0,d0
move.w _Volum,d0
move.l d0,-(sp)
move.w d1,_Volum
move.l d1,-(sp)
jbsr _ChnVol
addq.l #4,sp
move.l (sp)+,d0
rts
1: *======現在の値のみ
moveq #0,d0
move.w _Volum,d0
rts
2: *======エラー
moveq #-1,d0 *コール無し
rts
tr5_1f: *--------------------------------------------
*_CDC_FADEOUT equ $1F
*
* ・演奏をフェードアウトする。
*
* [引 数] d1.l = 0 ; フェードアウト開始
* = 1~255 ; フェードアウトの速度指定
* = -1 ; 現在のフェードアウト速度を返す
* [戻り値] d0.l = 現在のフェードアウト速度
* = -1 ; フェードアウトが出来ない。
* = -2 ; 既にフェードアウト始めている。
*
tst.w _MastVol
beq 2f
tst.l d1
bne 1f
*======フェードアウト開始
tst.w _Fadeouting
beq @f
**既にfadeoutしている
moveq #-2,d0
rts
@@: **fadeout開始
move.w _Volum,_FadeoutVol * フェードアウト中のボリューム
move.w #1,_Fadeouting
moveq #0,d0
move.w _FadeoutDec,d0
rts
1:
bmi 1f
*======フェードアウトの速度指定
moveq #0,d0
move.w _FadeoutDec,d0
move.w d1,_FadeoutDec
rts
1: *======現在のフェードアウト速度を返す
moveq #0,d0
move.w _FadeoutDec,d0
rts
2: *======エラー
moveq #-1,d0 *コール無し
rts
tr5_20: *--------------------------------------------
tr5_21: *--------------------------------------------
tr5_22: *--------------------------------------------
tr5_23: *--------------------------------------------
tr5_24: *--------------------------------------------
tr5_25: *--------------------------------------------
tr5_26: *--------------------------------------------
tr5_27: *--------------------------------------------
tr5_28: *--------------------------------------------
tr5_29: *--------------------------------------------
tr5_2a: *--------------------------------------------
tr5_2b: *--------------------------------------------
tr5_2c: *--------------------------------------------
tr5_2d: *--------------------------------------------
tr5_2e: *--------------------------------------------
tr5_2f: *--------------------------------------------
moveq #-1,d0 *コール無し
rts
*---------------------------------------------------
*
* CDC DRIVE MODE 関係
*
tr5_30: *--------------------------------------------
*_CDC_DRIVE equ $30
*
* ・CDCの心臓を動かす
*
* [引 数] なし
* [戻り値] なし
*
* TIMER-Cを乗っ取っていると、CDCが動きません。が、直接ある
* 一定期でこれをコールすれば大丈夫です。
*
* [参 考] MUTERMモード対応にも対応してます。が、使用するこ
* とはないでしょう。
*
move.w _ScscUse(pc),d0 *tst
beq @f
rts
@@: move.w $0a0e.w,d1 *現在処理中のIOCSコール番号(なければ-1)
cmpi.w #$F5,d1
bne @f
rts
@@:
move.l #-1,_cps_ot ****
move.w _MuTmMod(pc),d0 *tst *0:ノーマル 1:強引にキーベクタを書き替え
bne @f
bsr LoopChk_
bsr _WaitCC2 *-----------------------------[演奏用間隔]
rts
@@: *MUTERMモード
move.l MFP_BAK(pc),d0 *tst
bne tr5_30L
move.l MFP_,d1
cmp.l #MFP,d1
beq @f
move.l MFP_JMP+2(pc),MFP_BAK
move.l MFP_,MFP_JMP+2
move.l #MFP2,MFP_
@@: bra tr5_30E
tr5_30L:
move.l MFP_,d1
cmp.l #MFP2,d1
beq @f
move.l MFP_BAK(pc),MFP_JMP+2
move.l #MFP,MFP_
clr.l MFP_BAK
@@: *bra tr5_30E
tr5_30E
move.w MFP_cmd(pc),d0 *tst
bne @f
bsr NokeySeek
bra tr5_30EE
@@:
move.w #1,IocsSwc
move.w MFP_cmd(pc),d0
move.w MFP_cmd+2(pc),MFP_cmd
clr.w MFP_cmd+2
bsr KeySns
tr5_30EE:
bsr LoopChk
clr.w IocsSwc
rts
MFP2: bra MFP
tr5_31: *--------------------------------------------
*_CDC_MODE equ $31
*
* ・CDCの演奏モードを設定(トグル)
*
* [引 数] d1.l = モード
* = 0 ; オート
* = 1 ; リピート
* = 2 ; ランダム
* = -1 ; モードののみ返す
* [戻り値] d0.l = 現在のモード ; 正常終了
* 現在のモードは
* bit0 :オート
* bit1 :リピート
* bit2 :ランダム
* bit3 :メモリー
* [bit4 :BGM]
*
* 設定は _CDC_INKEY($7)でそれぞれのキーコードを、送った時
* を同じ処理をします(ただし入力数字は無視されます)ので、場合
* により演奏開始されます。
*
* モード変更はトグルで行われるので一度モードを調べてから設
* 定したほうがいいでしょう。
*
move.l d1,-(sp)
moveq #0,d0
move.w _AutoMode(pc),d1 *0:ノーマル 1:オート
beq @f
ori.w #%00001,d0
@@: move.w _ReptMode(pc),d1 *0:ノーマル 1:リピート
beq @f
ori.w #%00010,d0
@@: move.w _RndMode(pc),d1 *0:ノーマル 1:ランダム
beq @f
ori.w #%00100,d0
@@: move.w _MemLong(pc),d1 *メモリながさ 0以外ならMEMORY
beq @f
ori.w #%01000,d0
@@: move.w _BgmMode(pc),d1 *0:ノーマル 1:BGM
beq @f
ori.w #%10000,d0
@@:
move.l (sp)+,d1
bpl @f
rts
@@: move.l d0,-(sp)
subq.w #1,d1
bpl @f
*0*
clr.w _DisSuuzi10 * LED用数字クリア
bsr Tauto *オート
bra tr5_31E
@@:
bne @f
*1*
clr.w _DisSuuzi10 * LED用数字クリア
bsr Tundo *リピート
bra tr5_31E
@@:
subq.w #1,d1
bne @f
*2*
bsr Trnd *ランダム
*bra tr5_31E
@@:
tr5_31E:
move.l (sp)+,d0
rts
tr5_32: *--------------------------------------------
*_CDC_KEYMODE equ $32
*
* ・CDCのキー操作関係のモードを設定
*
* [引 数] d1.l = モード
* 0 ; 一切受け付けない (-KS)
* 1 ; 受け付ける
* -1 ; 現在のモードのみ返す
* [戻り値] d0.l = 前のモード ; 正常終了
*
moveq #0,d0
move.w _KeySwi(pc),d0 *1;キー入力可能 0;不可能
tst.l d1
bpl @f
rts
@@:
move.w d1,_KeySwi
rts
tr5_33: *--------------------------------------------
*_CDC_LED equ $33
*
* ・CDCのLEDの表示モードを設定する
*
* [引 数] d1.l = 0 ; 非表示モード
* 1 ; 表示モード
* 2 ; 左部のみ表示モード
* = -1 ; 現在の値
* [戻り値] d0.l = 前のモード ; 正常終了
* < 0 ; エラー
*
* 表示モードにしてもTEXTが使われていると表示されません
*
* [参 考] Trapコールで強制LED表示モードはありません
*
* [★注意]ver 1.06以前では
* [引 数] d1.l = 1 ; 非表示モード
* 0 ; 表示モード
* でした。。
*
moveq #0,d0
move.w _DisMode(pc),d0
andi.l #$03,d0
tst.l d1
bpl @f
rts
@@:
beq 1f
cmpi.l #1,d1
beq 2f
move.l d0,-(sp)
bsr FnkBerChk
beq @f
bsr KillLeds
@@: move.l (sp)+,d0
move.w #2,_DisMode *0;非表示 1;表示 2;Small表示
rts
2:
move.w #1,_DisMode *0;非表示 1;表示 2;Small表示
rts
1:
move.l d0,-(sp)
bsr FnkBerChk
beq @f
bsr KillLeds
@@: move.l (sp)+,d0
clr.w _DisMode *0;非表示 1;表示 2;Small表示
rts
tr5_34: *--------------------------------------------
*_CDC_TIMING equ $34
*
* ・CDチェックする間隔設定(基本的に使用禁止)
*
* [引 数] d1.w = 1/100s単位
* = -1 ; 現在の値
* [戻り値] d0.w = 前の値(単位1/100s) ; 正常終了
* < 0 ; エラー
*
* 間隔チェックには IOCS の TIMER-C のワークを見ているので
* TIMER-C を変更している場合、意味がありません。
*
moveq #0,d0
move.w _PlyWitT(pc),d0
swap d0
move.w _KeyTDCT(pc),d0
tst.l d1
bpl @f
rts
@@:
tst.w d1
bne @f
moveq #-1,d0
rts
@@: move.l d0,-(sp)
move.l d1,d0
jbsr _SetKeyTDCT *move.w d0,_KeyTDCT
move.l (sp)+,d0
rts
tr5_35: *--------------------------------------------
*_CDC_POWER equ $35
*
* ・CDC の機能を制御
*
* [引 数] d1.l = 1 ; 機能する
* = 0 ; 停止する ([ESC])
* = -1 ; 現在の値
* [戻り値] d0.l = 前の値 ; 正常終了
* < 0 ; エラー
*
* 機能を停止しても trap #5 での操作も可能ですが、_CDC_DRIVE
* を常用する必要があります。
*
moveq #0,d0
move.w _CdcMode(pc),d0
andi.l #$01,d0
tst.l d1
bpl @f
rts
@@:
jbne _CdcModeOn
@@:
move.l d0,-(sp)
bsr FnkBerChk
beq @f
bsr KillLeds
@@: move.l (sp)+,d0
clr.w _CdcMode *0:停止中
clr.w _CDIN *0:CDは入っていない 1:入っている
clr.b _CHARBUF *LED文字
rts
tr5_36: *--------------------------------------------
*_CDC_TRACKMODE equ $36
*
* ・トラック記憶モードを変える(演奏も停止します)。
*
* [引 数] d1.l = 0 ; タイトルリストファイルを参照、
* 拡張トラック設定
* = 1 ; 拡張トラック設定解除
* [戻り値] なし
*
* タイトルリストファイルからの登録を行います。タイトルリス
* トファイルを変更した時これを実行すれば読み込んでくれます。
*
* ジュークボックスモード時は使用禁止です、
*
* [参 考] d1.l==1 は主にZCDC.xで使用します。普通の音楽演奏の
* 場合は意味がないでしょう。
*
tst.l d1
bne @f
jbsr _ZeroUnit
clr.w _AutoMode *0:ノーマル 1:オート
clr.w _RndMode *0:ノーマル 1:ランダム
bsr _FlgClrS
bsr _ChkCdRom
bsr _CdListRead
rts
@@:
jbsr _ZeroUnit
clr.w _AutoMode *0:ノーマル 1:オート
clr.w _RndMode *0:ノーマル 1:ランダム
bsr _FlgClrS
bsr _CdListSub
rts
tr5_37: *--------------------------------------------
*_CDC_KEYCANSEL equ $37
*
* ・CDCのキー操作無効を個別に設定
*
* [引 数] d1.l = 無効にするキーボードコード
* = -1 ; 全てもとに戻す
* [戻り値] なし
*
* アプリでキーボードからのコントロールが困る物がある場合、
* 特定のキーのみ無効に出来ます。アプリ終了時もとに戻すこと。
*
* [参 考] スイッチ -B[n]でも、もとに戻すことが出来ます。
*
tst.l d1
bpl tr5_31L
move.l CmdC_ListD(pc),CmdC_List
move.l CmdC_ListD+4(pc),CmdC_List+4
move.l CmdC_ListD+8(pc),CmdC_List+8
move.l CmdC_ListD+12(pc),CmdC_List+12
rts
tr5_31L:
move.l d1,d0
andi.l #$FFFF_FF80,d0
beq @f
rts **エラー
@@: move.w d1,d0
lsr.w #3,d0
lea CmdC_List(pc),a0
bclr.b d1,(a0,d0.w)
rts
tr5_38: *--------------------------------------------
*_CDC_TIMELED equ $38
*
* ・CDCのTIMEのLEDの表示モードを設定する
*
* [引 数] d1.l = 0 ; ノーマル
* 1 ; リバース
* 2 ; トータル
* 3 ; トータルリバース
* = -1 ; 現在の値
* [戻り値] d0.l = 前のモード ; 正常終了
* < 0 ; エラー
*
moveq #0,d0
move.w _LEDTMRV(pc),d0
tst.l d1
bpl @f
rts
@@:
andi.w #3,d1
move.w d1,_LEDTMRV
bra tr5_exsub
tr5_39: *--------------------------------------------
*_CDC_LEDXY equ $39
*
* ・CDCのLEDの座標を得る
*
* [引 数] なし
* [戻り値] d0.wh = X座標
* d0.wl = Y座標
*
* [★注意]ver 1.08以降新規です。
*
move.l _DRAWADDS,d0
move.l d0,d1
andi.l #$7F,d0
swap d0
lsr.l #7,d1 * /128
lsr.l #4,d1 * /16
andi.w #$3F,d1
move.w d1,d0
rts
tr5_3a: *--------------------------------------------
*_CDC_SCSIID equ $3a
*
* ・CDCの管理しているSCSI-ID(LUN)を得る
*
* [引 数] なし
* [戻り値] d0.wh = LUN
* d0.wl = ID
*
* [★注意]ver 1.09以降新規です。
*
move.l _SCSI_IDF,d0
andi.l #$00FFFFFF,d0
rts
tr5_3b: *--------------------------------------------
*_CDC_EJEEMU equ $3b
*
* ・CDCの管理しているSCSI機器が一度エジェクトされた事にする
*
* [引 数] なし
* [戻り値] なし
*
* [★注意]ver 1.09以降新規です。
*
bra _EJE_EMU
tr5_3c: *--------------------------------------------
*_CDC_CHGLUN equ $3c
*
* ・LUNを切り換える
*
* [引 数] d1.l = LUN (0~7)
* = -1 ; 現在の値
* [戻り値] d0.l = LUN (0~7) ; 正常終了
* = 100 ; ジュークボックスモード
* < 0 ; エラー
*
* LUNを切り換えます。切り換えたと同時にタイトルリストファ
* イルからの登録も行います。
*
* [★注意]ver 1.09以降新規です。
*
moveq #0,d0
move.w _SCSI_LUN__,d0
tst.l d1
bpl 1f
*======-1 なら今の値
tst.w _JukeBox *0:ノーマル 1:JukeBox
beq @f
moveq #100,d0
@@: rts
1:
*====== 現在の LUN チェック
tst.w _JukeBox *0:ノーマル 1:JukeBox
bne @f
cmp.w d0,d1
bne @f *JUKE BOX でなく LUN が同じならそのまま
rts
@@:
cmpi.w #8,d1
bcs @f
moveq #-1,d0 *8以上ならエラー
rts
@@:
move.l d1,-(sp)
*jbsr _StpDsk
jbsr _ZeroUnit
move.l (sp),d0
jbsr _SetLUN *LUN変更 d0=LUN
*jbsr _ejeload *トレイを出して直ぐ戻す。MBR-7ならいいが・・・
clr.w _TrkNo
clr.w _TrkNoS
clr.w _DtTrak *1;データトラック有り,-1;データのみ
clr.w _MemMode *0:ノーマル 1:メモリ
clr.w _MemLong *メモリながさ 0以外ならMEMORY
clr.w _JukeBox *0:ノーマル 1:JukeBox
move.w #-1,_MemPt
move.w #-1,_RndPt
clr.w _DisSuuzi10 * LED用数字クリア
jbsr _EJE_EMU
clr.w _AutoMode *0:ノーマル 1:オート
clr.w _RndMode *0:ノーマル 1:ランダム
bsr _FlgClrS
bsr _ChkCdRom
bsr _CdListRead
move.l (sp)+,d0
bra tr5_exsub
tr5_3d: *--------------------------------------------
tr5_3e: *--------------------------------------------
tr5_3f: *--------------------------------------------
moveq #-1,d0 *コール無し
rts
tr5_exsub:
move.l d0,-(sp)
clr.w _DisSuuzi10 * LED用数字クリア
bsr FncBarC
bsr FncBar2
bsr FncBar
clr.w _LEDVMOD
jbsr _WaitCC *今の1/100s
addi.w #300,_KeyTD *すぐに実行されるように
move.l (sp)+,d0
rts
*---------------------------------------------------
*
* CDC ERROR CORDS
*
*
* -1 ;
* -2 ; Play Audio Begin ・ Play Audio Block Count Command error'演奏できない'
* -3 ; Start Track Address or ReadTOC Command error'演奏できない'
* -4 ; 指定された曲番号は、存在しない
* -5 ; Leadout Track Address or ReadTOC Command error
* -100 ; CD-ROM でない 準備されていない
*
*
* 戻り値としてd0が使われていなくても破壊されます.
*
*
*---------------------------------------------------
*
* CDC バージョンの差
*
*
* 以下のコールは_CDC_VERSIONで得られる数値の$107未満と以降では引数等に違
* ってしまっています。ご注意下さい。
*
* _CDC_INKEY equ $07
* _CDC_LED equ $33
*
* 以下のコールは_CDC_VERSIONで得られる数値の$108以降新規です。
*
* _CDC_LEDXY equ $39
*
* 以下のコールは_CDC_VERSIONで得られる数値の$109以降新規です。
*
* _CDC_SCSIID equ $3a
* _CDC_EJEEMU equ $3b
* _CDC_CHGLUN equ $3b
*
*